﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Logica;
using ReportesMGI;
using ComunesMGI.Mensajes;

namespace ClienteWinMGI.Presentacion
{
    public partial class ReporteIncidentesAsignadosPeriodo : Form
    {
        private List<DataUsuario> _usuarios;
        private List<DataSistema> _sistemasDeCliente;
        private List<DataCliente> _clientes;

        public ReporteIncidentesAsignadosPeriodo()
        {
            InitializeComponent();
            CargarUsuarios();
            CargarClientes();
            clearValidator();
            hideLoader();
        }

        private void showLoader()
        {
            picLoader.Visible = true;
        }
        private void hideLoader()
        {
            picLoader.Visible = false;
        }

        private void clearValidator()
        {
            imgValidator.Visible = false;
            lblValidator.Visible = false;
        }

        private void showValidator(string textoValidator)
        {
            imgValidator.Visible = true;
            lblValidator.Visible = true;
            lblValidator.Text = textoValidator;
        }

        private void CargarUsuarios()
        {
            IUsuarios iu = LogicaFactory.getInstance().getIUsuarios();
            _usuarios = iu.getUsuarios();
            for (int i = 0; i < _usuarios.Count(); i++)
            {
                string nombreUsuario = _usuarios[i].Nombre;
                nombreUsuario.Replace(" ", "");
                cboUsuario.Items.Add(nombreUsuario);
            }
            cboUsuario.SelectedIndex = -1;
            cboCliente.Enabled = false;

        }

        private void CargarClientes()
        {
            List<DataCliente> _ldc;
            IClientes _il = LogicaFactory.getInstance().getIClientes();
            _ldc = _il.getClientes();
            foreach (DataCliente dc in _ldc)
            {
                cboCliente.Items.Add(dc.Nombre);
            }
            _clientes = _ldc;

            cboCliente.SelectedIndex = -1;
            cboSistema.Enabled = false;

        }

        private void cboCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            clearValidator();
            cboSistema.Items.Clear();
            DataCliente actualDc = _clientes.First(ds => ds.Nombre == cboCliente.SelectedItem.ToString());
            ISistemas _sist = LogicaFactory.getInstance().getISistemas();
            List<DataSistema> _lista = _sist.getSistemas(actualDc.Codigo);
            for (int i = 0; i < _lista.Count(); i++)
            {
                DataSistema _dataSist = _lista[i];
                //string item = " Nombre=" + _dataSist.Nombre + ";" + "Sitio=" + _dataSist.Sitio;
                string item = _dataSist.Nombre;
                cboSistema.Items.Add(item);
            }
            _sistemasDeCliente = _lista;
            cboSistema.SelectedIndex = -1;
            cboSistema.Enabled = true;
        }

        private void btnReporte_Click(object sender, EventArgs e)
        {
            showLoader();
            this.Refresh();
            this.Update();
            clearValidator();
            if (cboUsuario.SelectedIndex != -1)
            {
                if (cboCliente.SelectedIndex != -1)
                {
                    if (cboSistema.SelectedIndex != -1)
                    {
                        DataCliente _datoCliente = new DataCliente(cboCliente.SelectedItem.ToString());
                        DataSistema _datoSistema = _sistemasDeCliente.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());

                        IIncidentes _inc = LogicaFactory.getInstance().getIIncidentes();
                        string nombreUsuario = cboUsuario.SelectedItem.ToString();
                        nombreUsuario = nombreUsuario.Trim();
                        List<DataIncidenteReporte> _liap = _inc.VisualizarIncidentesAsignados(_datoSistema.Codigo, nombreUsuario, dTPFechaDesde.Value, dTPFechaHasta.Value); 
                        if (_liap != null && _liap.Count > 0)
                        {
                            FormReportes fr = new FormReportes();
                            fr.setReporteAsignadosPeriodos();
                            fr.SetDataSourceReporteIncidentesAsignados(_liap, dTPFechaDesde.Value, dTPFechaHasta.Value);
                            fr.ShowDialog();
                        }
                        else
                        {
                            Error err = new Error("Error", "No existen incidentes cerrados para el periodo seleccionado.", "Modifique el periodo en el cual quiere visualizar los incidentes cerrados para poder generar el reporte.");
                            err.ShowDialog();
                        }
                    }
                else
                {
                    showValidator("El campo del sistema no puede ser vacío");
                }
            }else
                {
                    showValidator("El campo del cliente no puede ser vacío");
                }
            }else
            {
                showValidator("El campo del usuario no puede ser vacío");
            }
            hideLoader();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cboUsuario_SelectedIndexChanged(object sender, EventArgs e)
        {
            cboCliente.Enabled = true;
        }

    }
}
